/*
 * IndexBuffer.h
 *
 *  Created on: 2011/06/25
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_GRAPHICS_INDEXBUFFER_H
#define INCLUDED_NTENGINE_GRAPHICS_INDEXBUFFER_H

namespace NTEngine {
namespace Xml {
	class ConstElement;
} // namespace PseudoXml
namespace Graphics {

/**
 * @brief インデックスバッファ
 */
class IndexBuffer {
public:
	/**
	 * Xmlからインスタンスを確保します。
	 */
	static IndexBuffer create( Xml::ConstElement );

	/**
	 * インスタンスを確保します。
	 */
	static IndexBuffer create( int indexNumber );

	/**
	 * グラフィックスメモリ書き込み用のバッファを確保します
	 * この機能により取得したバッファはunlockによって適切に処理してください
	 *
	 */
	void lock( unsigned short** );

	/**
	 * グラフィックスメモリに書き込み、書き込み用のバッファを破棄します
	 * lockで取得したバッファを指定してください。
	 *
	 */
	void unlock( unsigned short** );

	/**
	 * 名前を取得します。
	 */
	const char* name() const;

	/**
	 * @brief 頂点数を取得します。
	 */
	int indexNumber() const;

	IndexBuffer();
	~IndexBuffer();
	IndexBuffer( const IndexBuffer& );
	void release();
	IndexBuffer& operator=( const IndexBuffer& );
	bool operator==( const IndexBuffer& ) const;
	bool operator!=( const IndexBuffer& ) const;
	int referenceCount() const;
	operator void*() const;
	class Impl;
	IndexBuffer( const Impl* );
private:
	friend class Manager;
	Impl* mImpl;
};

} // namespace Graphics
} // namespace NtEngine

#endif // INCLUDED_NTENGINE_GRAPHICS_INDEXBUFFER_H
